package com.ld.poetry.controller;

import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.ld.poetry.config.PoetryResult;
import com.ld.poetry.constants.CommonConst;
import com.ld.poetry.dao.ResourcePathMapper;
import com.ld.poetry.entity.ResourcePath;
import com.ld.poetry.vo.ResourcePathVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 资源聚合里的收藏夹，其他接口在ResourceAggregationController
 * 
 * 收藏夹控制器
 * 该控制器负责处理收藏夹相关的请求，主要功能包括：
 * 1. 查询收藏夹中的资源列表
 * 2. 按分类组织收藏资源
 * 3. 管理收藏资源的状态
 * 
 * 主要特点：
 * - 资源按分类分组展示
 * - 只显示已启用的资源
 * - 资源按标题升序排序
 * 
 * 使用说明：
 * 1. 通过 /webInfo/listCollect 接口获取收藏列表
 * 2. 返回的数据按分类分组
 * 3. 每个资源包含完整的 ResourcePathVO 信息
 * 
 * @author sara
 * @since 2021-09-14
 */
@RestController
@RequestMapping("/webInfo")
public class CollectController {

    /**
     * 资源路径Mapper
     * 用于数据库操作，处理ResourcePath相关的数据
     */
    @Autowired
    private ResourcePathMapper resourcePathMapper;

    /**
     * 查询收藏列表
     * 
     * 该方法用于获取收藏夹中的所有资源，并按分类进行分组。
     * 主要功能：
     * 1. 查询类型为收藏的资源
     * 2. 只返回状态为启用的资源
     * 3. 按标题升序排序
     * 4. 按分类进行分组
     * 
     * 返回数据格式：
     * {
     *   "code": 200,
     *   "msg": "success",
     *   "data": {
     *     "分类1": [
     *       {
     *         "id": 1,
     *         "title": "资源标题",
     *         "classify": "分类1",
     *         ...
     *       }
     *     ],
     *     "分类2": [...]
     *   }
     * }
     * 
     * @return PoetryResult<Map<String, List<ResourcePathVO>>> 按分类分组的资源列表
     */
    @GetMapping("/listCollect")
    public PoetryResult<Map<String, List<ResourcePathVO>>> listCollect() {
        // 构建查询条件
        LambdaQueryChainWrapper<ResourcePath> wrapper = new LambdaQueryChainWrapper<>(resourcePathMapper);
        // 查询类型为收藏且状态为启用的资源
        List<ResourcePath> resourcePaths = wrapper.eq(ResourcePath::getType, CommonConst.RESOURCE_PATH_TYPE_FAVORITES)
                .eq(ResourcePath::getStatus, Boolean.TRUE)
                .orderByAsc(ResourcePath::getTitle)
                .list();
        
        // 初始化结果Map
        Map<String, List<ResourcePathVO>> collect = new HashMap<>();
        if (!CollectionUtils.isEmpty(resourcePaths)) {
            // 将ResourcePath转换为ResourcePathVO并按分类分组
            collect = resourcePaths.stream().map(rp -> {
                ResourcePathVO resourcePathVO = new ResourcePathVO();
                BeanUtils.copyProperties(rp, resourcePathVO);
                return resourcePathVO;
            }).collect(Collectors.groupingBy(ResourcePathVO::getClassify));
        }
        return PoetryResult.success(collect);
    }
}
